
import com.zy.je.common.core.exception.BizException;
import lombok.extern.slf4j.Slf4j;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

/**
 * xml转换工具
 */
@Slf4j
public class XmlUtil {
    /**
     * 将对象直接转换成String类型的 XML输出
     *
     * @param obj
     * @return
     */
    public static String toXmlString(Object obj) {
        try {
            // 创建输出流
            StringWriter sw = new StringWriter();
            // 利用jdk中自带的转换类实现  
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            // 格式化xml输出的格式  
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");//编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);//是否格式化生成xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            // 将对象转换成输出流形式的xml
            marshaller.marshal(obj, sw);
            return sw.toString();
        } catch (JAXBException e) {
            log.error("转换数据出错({})：{}", e.getMessage(), e);
            throw new BizException(e);
        }
    }

    /**
     * 将String类型的xml转换成对象
     */
    public static <T> T parseObject(Class<T> clazz, String xmlStr) {
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            // 进行将Xml转成对象的核心接口
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader sr = new StringReader(xmlStr);
            Object xmlObject  = unmarshaller.unmarshal(sr);
            return (T) xmlObject;
        } catch (JAXBException e) {
            log.error("转换数据出错({})：{}", xmlStr, e.getMessage(), e);
            throw new BizException(e);
        }
    }


//    /**
//     * 将对象根据路径转换成xml文件
//     *
//     * @param obj
//     * @param path
//     * @return
//     */
//    public static void convertToXml(Object obj, String path) {
//        try {
//            // 利用jdk中自带的转换类实现
//            JAXBContext context = JAXBContext.newInstance(obj.getClass());
//
//            Marshaller marshaller = context.createMarshaller();
//            // 格式化xml输出的格式
//            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
//                    Boolean.TRUE);
//            // 将对象转换成输出流形式的xml
//            // 创建输出流
//            FileWriter fw = null;
//            try {
//                fw = new FileWriter(path);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//            marshaller.marshal(obj, fw);
//        } catch (JAXBException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//
//    @SuppressWarnings("unchecked")
//    /**
//     * 将file类型的xml转换成对象
//     */
//    public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
//        Object xmlObject = null;
//        try {
//            JAXBContext context = JAXBContext.newInstance(clazz);
//            Unmarshaller unmarshaller = context.createUnmarshaller();
//            FileReader fr = null;
//            try {
//                fr = new FileReader(xmlPath);
//            } catch (FileNotFoundException e) {
//                e.printStackTrace();
//            }
//            xmlObject = unmarshaller.unmarshal(fr);
//        } catch (JAXBException e) {
//            e.printStackTrace();
//        }
//        return xmlObject;
//    }
}